package br.com.cast.scc.dao;

import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;

import javax.persistence.Query;

import org.springframework.stereotype.Component;

import br.com.cast.scc.model.DominioTipoVeiculo;
import br.com.cast.scc.model.Veiculo;
import br.com.cast.scc.util.UtilString;
import br.com.cast.scc.veiculo.FiltroPesquisaVeiculos;

@Component
public class VeiculoDAO extends DAOBase<Veiculo> {

	public boolean veiculoJaCadastrado(Veiculo veiculo) {
		StringBuilder hql = new StringBuilder();

		hql.append("SELECT COUNT (*) as qtd ").append("FROM Veiculo ")
				.append("WHERE rntrc = :rntrc");

		if (veiculo.getCodigo() != null) {
			hql.append(" AND codigo <> :codigo ");
		}

		Query query = getEntityManager().createQuery(hql.toString());

		if (veiculo.getCodigo() != null) {
			query.setParameter("codigo", veiculo.getCodigo());
		}
		return (long) query.getSingleResult() > 0;
	}

	@SuppressWarnings("unchecked")
	public Iterator<? extends Veiculo> consultaPaginada(long inicio,
			long total, FiltroPesquisaVeiculos filtro) {
		Map<String, Object> parametros = new HashMap<>();
		
		StringBuilder hql = criaQueryConsultaPaginada(filtro, parametros);
		
		Query query = getEntityManager().createQuery(hql.toString());
		
		for (String parametro : parametros.keySet()) {
				query.setParameter(parametro,parametros.get(parametro));
		}
		
		query.setFirstResult((int) inicio);
		query.setMaxResults((int) total);
		
		return query.getResultList().iterator();
		
	}

	private StringBuilder criaQueryConsultaPaginada(
			FiltroPesquisaVeiculos filtro, Map<String, Object> parametros) {

		StringBuilder hql = new StringBuilder();

		hql.append("SELECT V ").append("FROM Veiculo V ")
				.append("  JOIN v.tpVeiculo t ").append("   WHERE 1 = 1 ");

		if (filtro.getTipoVeiculo() != null) {
			hql.append(" AND t.codigo = :tpVeiculo");
			parametros.put("tpVeiculo", filtro.getTipoVeiculo().getCodigo());
		}
		if (filtro.getStatus() != null) {
			hql.append(" AND v.status = :status ");
			parametros.put("status", filtro.getStatus().getSituacao());
		}
		if (isTipoTerrestreSelecionado(filtro)) {

			if (!UtilString.isStringVazia(filtro.getRntrc())) {
				hql.append(" AND v.rntrc = :rntrc");
				parametros.put("rntrc", filtro.getRntrc());
			}
			if (!UtilString.isStringVazia(filtro.getPlaca())) {
				hql.append(" AND (v.placar1 = :placa ")
						.append("          OR v.placa2 = :placa ")
						.append("          OR v.placa3 = :placa ")
						.append("          OR v.placa4 = :placa ) ");
				parametros.put("placa", filtro.getPlaca());
			}
		} else {
			if (filtro.getNuEmbarcacao() != null) {
				hql.append(" AND v.nuEmbarcacao = :neEmbarcacao ");
				parametros.put("nuEmbarcacao", filtro.getNuEmbarcacao());
			}
		}
		return hql;
	}

	private boolean isTipoTerrestreSelecionado(FiltroPesquisaVeiculos filtro) {
		return filtro.getTipoVeiculo() != null && filtro.getTipoVeiculo().getCodigo().equals(DominioTipoVeiculo.COD_TERRESTRE);
	}

	
}
